from machine import Pin, PWM
import time

# 定义蜂鸣器引脚（GPIO27），低电平触发
buzzer_pin = Pin(27, Pin.OUT)
buzzer = PWM(buzzer_pin, freq=440, duty=0)  # 初始频率设为440Hz（中音6），占空比0（关闭）

# 《两只老虎》简谱对应的频率（Hz）
notes = {
    '1': 262,   # 中音1
    '2': 294,   # 中音2
    '3': 330,   # 中音3
    '4': 349,   # 中音4
    '5': 392,   # 中音5
    '6': 440,   # 中音6
    '7': 494,   # 中音7
    '1h': 523,  # 高音1
    '': 0       # 休止符
}

# 《两只老虎》简谱（音符 + 节拍，4/4拍）
tiger_song = [
    ('1', 1), ('2', 1), ('3', 1), ('1', 1),
    ('1', 1), ('2', 1), ('3', 1), ('1', 1),
    ('3', 1), ('4', 1), ('5', 2),
    ('3', 1), ('4', 1), ('5', 2),
    ('5', 0.5), ('6', 0.5), ('5', 0.5), ('4', 0.5), ('3', 1), ('1', 1),
    ('5', 0.5), ('6', 0.5), ('5', 0.5), ('4', 0.5), ('3', 1), ('1', 1),
    ('2', 1), ('5', 1), ('1', 2),
    ('2', 1), ('5', 1), ('1', 2)
]

def play_note(note, beat, tempo=120):
    """播放指定音符"""
    if note == '' or note not in notes:
        # 休止符，关闭蜂鸣器（通过占空比0实现）
        buzzer.duty(0)
    else:
        # 设置频率和占空比（50%占空比）
        buzzer.freq(notes[note])
        buzzer.duty(512)  # 1024的一半，50%占空比
    
    # 计算播放时间（秒）
    duration = (60 / tempo) * beat
    time.sleep(duration)
    
    # 音符间短暂停顿
    buzzer.duty(0)
    time.sleep(0.05)

try:
    print("开始播放《两只老虎》...")
    for note, beat in tiger_song:
        play_note(note, beat)
    print("播放结束")
finally:
    # 停止PWM，释放资源
    buzzer.deinit()
    buzzer_pin.value(0)  # 确保低电平触发的蜂鸣器最终处于关闭状态